package co.edu.usbcali.unidades.filtroseguridad;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import co.edu.usbcali.unidades.modelo.Usuario;
import co.edu.usbcali.unidades.utilities.FacesUtils;



public class LoginFilter implements Filter {
	
	private List<String> propietario = new ArrayList<String>();
	private List<String> adminGlobal = new ArrayList<String>();
	private List<String> vigilante = new ArrayList<String>();
	private List<String> adminLocal = new ArrayList<String>();
	private List<String> externo = new ArrayList<String>();
	
	public void destroy() {
		// TODO Auto-generated method stub
	}
	
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//casting del request y response que llegan por parametro
		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
		
		String path = httpServletRequest.getContextPath();
		String basePath = httpServletRequest.getScheme()+"://"+httpServletRequest.getServerName()+":"+httpServletRequest.getServerPort()+path+"/";
		
		// se pide la sesion que viene en el request si existe, si no existe no crea una nueva 
		HttpSession session = httpServletRequest.getSession(false);
		
		String pageRequested = httpServletRequest.getRequestURI().toString();

		if (session == null) {
			session = httpServletRequest.getSession(true);
			httpServletResponse.sendRedirect(basePath);
		} else {
			if(externo.contains(pageRequested)){
				chain.doFilter(request, response);
			}else if ((session.getAttribute("usuario") == null) && (!pageRequested.contains("unidades/JSPXINICIO/iniciarSesion.jspx"))) {
				httpServletResponse.sendRedirect(basePath);
			}
		}
		
		if (session.getAttribute("usuario") != null){
		Usuario usuario = (Usuario) session.getAttribute("usuario");
		String tipoUsuario = session.getAttribute("TipoUsuario").toString();
		if(usuario != null && !pageRequested.contains("JSPXINICIO/iniciarSesion.jspx")){
		
			if((tipoUsuario.equals("1")==true) && (propietario.contains(pageRequested)==true)){
				chain.doFilter(request, response);
			}else if((tipoUsuario.equals("2")==true)&&( adminGlobal.contains(pageRequested)==true)){
				chain.doFilter(request, response);
			}else if((tipoUsuario.equals("4")==true)&&( vigilante.contains(pageRequested)==true)){
				chain.doFilter(request, response);
			}else if((tipoUsuario.equals("5")==true)&& (adminLocal.contains(pageRequested)==true)){
				chain.doFilter(request, response);
			}else{
				session.setAttribute("usuario", null);
				//session.invalidate();
				session = httpServletRequest.getSession(true);
				httpServletResponse.sendRedirect(basePath);
				chain.doFilter(request, response);
			}
			
		}
		}
					
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		propietario = llenarPropietario(propietario);
		adminGlobal = llenarAdministradorGlobal(adminGlobal);
		vigilante = llenarVigilante(vigilante);
		adminLocal = llenarAdministradorLocal(adminLocal);
		externo = llenarExterno(externo);
	}
	

	public List<String> llenarPropietario(List<String> propietario){
		propietario.add("/unidades/JSPXINICIO/iniciarSesion.jspx");		
		propietario.add("/unidades/JSPX/menuInicialPropietario.jspx");
		
		propietario.add("/unidades/JSPX/pagoFacturas.jspx");
		propietario.add("/unidades/JSPX/facturaListDataTable.jspx");
		
		propietario.add("/unidades/JSPX/seleccionDeRol.jspx");
		
		propietario.add("/unidades/JSPX/personaFamiliar.jspx");
		
		propietario.add("/unidades/JSPX/cambiarUsuario.jspx");
		
		propietario.add("/unidades/JSPX/autorizacion.jspx");
		
		propietario.add("/unidades/JSPX/reserva.jspx");
		
		propietario.add("/unidades/JSPX/vehiculoListDataTableEditable.jspx");
		propietario.add("/unidades/JSPX/vehiculoListDataTable.jspx");
		propietario.add("/unidades/JSPX/vehiculo.jspx");
		
		return propietario;
		
	}

	public List<String> llenarAdministradorGlobal(List<String> adminGlobal){
		adminGlobal.add("/unidades/JSPXINICIO/iniciarSesion.jspx");
		adminGlobal.add("/unidades/JSPX/menuInicialAdminGlobal.jspx");
		
		adminGlobal.add("/unidades/JSPX/personaAdmin.jspx");
		adminGlobal.add("/unidades/JSPX/estadoListDataTableEditable.jspx");;
		adminGlobal.add("/unidades/JSPX/paisListDataTableEditable.jspx");		
		adminGlobal.add("/unidades/JSPX/ciudadListDataTableEditable.jspx");
		
		adminGlobal.add("/unidades/JSPX/PantallaUnidadResidencial.jspx");
		adminGlobal.add("/unidades/JSPX/cambiarUsuario.jspx");
	
		return adminGlobal;
		
	}
	
	public List<String> llenarAdministradorLocal(List<String> adminLocal){
		adminLocal.add("/unidades/JSPXINICIO/iniciarSesion.jspx");
		adminLocal.add("/unidades/JSPX/menuInicialAdminLocal.jspx");
		
		adminLocal.add("/unidades/JSPX/menuMultas.jspx");
		adminLocal.add("/unidades/JSPX/multa.jspx");
		adminLocal.add("/unidades/JSPX/multaListDataTable.jspx");
		
		adminLocal.add("/unidades/JSPX/crearAlerta.jspx");
		
		adminLocal.add("/unidades/JSPX/seleccionDeRol.jspx");
		
		adminLocal.add("/unidades/JSPX/cambiarUsuario.jspx");
		
		adminLocal.add("/unidades/JSPX/pantallaInmueble.jspx");
		adminLocal.add("/unidades/JSPX/inmueble.jspx");
		adminLocal.add("/unidades/JSPX/inmuebleListDataTableEditable.jspx");
		
		adminLocal.add("/unidades/JSPX/divisionListDataTableEditable.jspx");
		
		adminLocal.add("/unidades/JSPX/PantallaUnidadResidencial.jspx");
		adminLocal.add("/unidades/JSPX/ConsultarUnidadResidencial.jspx");
		adminLocal.add("/unidades/JSPX/unidadResidencial.jspx");
		
		adminLocal.add("/unidades/JSPX/persona.jspx");
		
		adminLocal.add("/unidades/JSPX/zonaComunListDataTableEditable.jspx");
		adminLocal.add("/unidades/JSPX/zonaExtraListDataTableEditable.jspx");
		adminLocal.add("/unidades/JSPX/seleccionDeUnidad.jspx");
		
		return adminLocal;
		
	}
	
	
	public List<String> llenarVigilante(List<String> vigilante){
		vigilante.add("/unidades/JSPXINICIO/iniciarSesion.jspx");
		vigilante.add("/unidades/JSPX/PantallaCelador.jspx");
		
		vigilante.add("/unidades/JSPX/cambiarUsuario.jspx");
		
		vigilante.add("/unidades/JSPX/PantallaCorrespondencia.jspx");
		vigilante.add("/unidades/JSPX/ConsultarCorrespondencia.jspx");
		vigilante.add("/unidades/JSPX/RecibirCorrespondencia.jspx");
		vigilante.add("/unidades/JSPX/ReclamarCorrespondencia.jspx");
		
		vigilante.add("/unidades/JSPX/ConsultarAutorizacion.jspx");
		vigilante.add("/unidades/JSPX/PantallaAutorizacionCelador.jspx");
		return vigilante;
		
	}

	public List<String> llenarExterno(List<String> externo){
		externo.add("/unidades/JSPXINICIO/iniciarSesion.jspx");
		return adminLocal;
		
	}
	
}
